'''
pyCar MQTT远程控制器 (电脑端)
用于发送控制指令给pyCar小车
使用用户自己的EMQX服务器
'''

import paho.mqtt.client as mqtt
import time
import ssl

# 导入配置文件
try:
    from config import *
    print("✅ 已加载配置文件")
except ImportError:
    print("❌ 未找到配置文件 config.py")
    print("💡 请复制 config_template.py 为 config.py 并填入你的配置信息")
    print("📖 详细说明请查看 README.md")
    raise ImportError("缺少配置文件")

# MQTT服务器配置 (与小车配置保持一致)
CLIENT_ID = "pyCar_Controller"  # 电脑端使用不同的客户端ID

def on_connect(client, userdata, flags, rc):
    """连接回调函数"""
    if rc == 0:
        print("✅ MQTT连接成功!")
        print(f"📡 服务器: {BROKER_ADDRESS}:{PORT}")
        print(f"👤 用户: {USERNAME}")
        print(f"📋 话题: {TOPIC}")
    else:
        print(f"❌ MQTT连接失败，返回码: {rc}")
        if rc == 5:
            print("💡 提示: 认证失败，请检查用户名和密码")

def on_publish(client, userdata, mid):
    """发布消息回调函数"""
    pass  # 可以在这里添加发送确认的处理

def send_command():
    """连接MQTT并发送指令"""
    try:
        print("🚀 启动pyCar MQTT控制器...")
        print("="*60)
        print(f"🌐 正在连接MQTT服务器: {BROKER_ADDRESS}:{PORT}")
        print(f"👤 用户名: {USERNAME}")
        print(f"🔒 使用SSL安全连接")
        
        # 创建MQTT客户端
        client = mqtt.Client(mqtt.CallbackAPIVersion.VERSION1, CLIENT_ID)
        
        # 设置用户名和密码
        client.username_pw_set(username=USERNAME, password=PASSWORD)
        
        # 启用TLS/SSL加密
        client.tls_set(ca_certs=None, certfile=None, keyfile=None, 
                      cert_reqs=ssl.CERT_REQUIRED, tls_version=ssl.PROTOCOL_TLS,
                      ciphers=None)
        
        client.on_connect = on_connect
        client.on_publish = on_publish
        
        # 连接到服务器
        client.connect(BROKER_ADDRESS, PORT, 60)
        client.loop_start()
        
        # 等待连接建立
        time.sleep(2)
        
        print("\n" + "="*60)
        print("🚗 pyCar远程控制器")
        print("="*60)
        print("🎮 可用指令:")
        print("  1 或 w 或 forward 或 前进  → 前进")
        print("  2 或 s 或 backward 或 后退 → 后退") 
        print("  3 或 a 或 left 或 左转     → 左转")
        print("  4 或 d 或 right 或 右转    → 右转")
        print("  0 或 x 或 stop 或 停止     → 停止")
        print("  test                      → 发送测试序列")
        print("  quit 或 q 或 exit         → 退出程序")
        print("="*60)
        print("💡 提示: 输入指令后按回车发送到小车")
        print("🔍 注意观察小车端的调试信息")
        print()
        
        while True:
            try:
                command = input("🎮 请输入指令: ").strip()
                
                if command.lower() in ['quit', 'q', 'exit']:
                    print("👋 正在退出...")
                    break
                
                if command.lower() == 'test':
                    # 发送测试序列
                    test_commands = ['w', 'stop', 's', 'stop', 'a', 'stop', 'd', 'stop']
                    print("🧪 发送测试序列...")
                    for i, cmd in enumerate(test_commands, 1):
                        print(f"  {i}/8 → 发送: {cmd}")
                        result = client.publish(TOPIC, cmd)
                        if result[0] == 0:
                            print(f"    ✅ 发送成功")
                        else:
                            print(f"    ❌ 发送失败: {result[0]}")
                        time.sleep(1.5)
                    print("✅ 测试序列完成")
                    continue
                
                if command:
                    # 发布指令
                    print(f"📤 发送指令: '{command}' → 话题: {TOPIC}")
                    result = client.publish(TOPIC, command)
                    if result[0] == 0:
                        print(f"✅ 发送成功 (消息ID: {result[1]})")
                        print("🔍 请查看小车端是否收到消息")
                    else:
                        print(f"❌ 发送失败，错误码: {result[0]}")
                else:
                    print("⚠️  请输入有效指令")
                    
            except KeyboardInterrupt:
                print("\n👋 检测到 Ctrl+C，正在退出...")
                break
                
    except Exception as e:
        print(f"❌ 连接错误: {e}")
        print("\n🔧 故障排除建议:")
        print("1. 检查网络连接")
        print("2. 确认小车已连接WiFi")
        print("3. 确认小车运行修改后的main.py")
        print("4. 检查MQTT服务器地址和认证信息")
        print("5. 确认话题名称一致")
        print("6. 检查SSL证书是否有效")
        
    finally:
        try:
            client.loop_stop()
            client.disconnect()
            print("🔌 已断开MQTT连接")
        except:
            pass

if __name__ == "__main__":
    send_command()
    print("📱 程序已结束") 